package com.qing.qingcodegenerate.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.qing.qingcodegenerate.model.dto.app.AppAddRequest;
import com.qing.qingcodegenerate.model.dto.app.AppQueryRequest;
import com.qing.qingcodegenerate.model.entity.App;
import com.qing.qingcodegenerate.model.entity.User;
import com.qing.qingcodegenerate.model.vo.AppVO;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 *  服务层。
 *
 * @author 86157
 * @since 2025-08-09
 */
public interface AppService extends IService<App> {

    /**
     * 应用聊天生成代码（流式）
     *
     * @param appId   应用 ID
     * @param message 用户消息
     * @param loginUser 登录用户
     * @param agent 是否启用 Agent 模式
     * @return 生成的代码流
     */
    Flux<String> chatToGenCode(Long appId, String message, User loginUser, boolean agent);
    /**
     * app实体转appVO,并关联用户信息
     *
     * @param app
     * @return
     */
    AppVO getAppVO(App app);
    /**
     * 获取查询条件
     *
     * @param appQueryRequest
     * @return
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * appList转appVOList
     *
     * @param appList
     * @return
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 部署app
     *
     * @param appId
     * @param loginUser
     * @return
     */
    String deployApp(Long appId, User loginUser);
    /**
     * 异步生成应用截图并更新封面
     *
     * @param appId  应用ID
     * @param appUrl 应用访问URL
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);

    /**
     * 新增app
     *
     * @param appAddRequest
     * @param loginUser
     * @return
     */
    Long createApp(AppAddRequest appAddRequest, User loginUser);
    /**
     * 删除app（同时删除关联的聊天历史）
     *
     * @param appId
     * @param loginUser
     * @return
     */
    boolean deleteApp(Long appId, User loginUser);


    void setAppAttr(Long appId, User loginUser);

    /**
     * 优化用户提示词（流式）
     *
     * @param originalPrompt 用户原始提示词

     * @return 优化后的提示词流
     */
    Flux<String> optimizePrompt(String originalPrompt);
}
